#include "head.h"

//定义一个函数指针类型'Fork_f',指向接收一个void指针作为参数并返回void指针的函数
typedef void *(Fork_f)(void *);

//定义一个结构体‘str_fork’用于存储进程信息
typedef struct str_fork{
    int pid;//进程的PID
    int id;//进程的ID（用户自定义的标识符）
    char name[128];//进程的名字（最大128字符）
} str_fork;

/*
函数名：fork_func
功能：用于创建一个子进程，并运行传入的函数指针所指向的函数
参数：
    @func 函数指针，指向要在子进程中运行的函数
    @data 函数指针所指向的函数的参数，传递给‘func’函数
返回值：
    成功：返回子进程的PID
    失败：返回-1
*/

int fork_func(Fork_f func,void *data)
{
    //如果传入的函数指针为空，返回-1
    if(NULL == func){
        return -1;
    }

    int pid=0;
    
    //创建子进程
    if(-1 == (pid=fork()))
    {
        perror("fork err");//如果创建失败，输出错误信息
        return -1;//返回-1表示创建失败
    }

    //子进程执行
    else if(0==pid){
        func(data);//在子进程中调用传入的函数，并将data作为参数传递
    }

    //父进程执行
    else if(0<pid){
        return pid;//父进程返回子进程的PID
    }

    return -1;//默认返回-1
}

/*
函数名：func_1
功能：该函数将在子进程中执行，打印出传入的数据
参数：
    @data 传入的数据，这里是‘str_fork’结构体
返回值：
    无，执行打印后退出子程序
*/
void *func_1(void *data)
{
    str_fork *S_2 = data;//将传入的void指针转换为‘str_fork’类型指针
    printf("pid=%d\n",S_2->pid);
    printf("id=%d\n",S_2->id);
    printf("name=%s\n",S_2->name);
    exit(0);//子进程完成打印后退出
}

int main(int argc,char *argv[])
{
    //初始化结构体‘S_1’，设置‘name’字段为‘张三’，并初始化‘id’和‘pid’
    str_fork S_1={.name = "张三"};
    S_1.id=10;
    S_1.pid=8888;

    fork_func(func_1,&S_1);
    return 0;
}